#include <stdio.h>
#include "math.h"

//----------OPCAO 3----------
//Opcao 3 do menu inicial: Funcao que verifica a viabilidade de um projeto dado o tamanho das equipes, o percentual de juros e quantos meses tem o projeto
void viabilidadeDoProjeto()
{
    int numeroEquipes, t, CP0, CPI, VPI;
    float j = 0, VPL = 0;
    
    //Le os valores: Numero de Equipes, Juros e Meses de projeto
    scanf("%d", &numeroEquipes);
    scanf("%f", &j);
    scanf("%d", &t);
    
    //Verifica se o juros esta entre 0 e 100%, meses eh maior que zero e numero de equipes eh maior que zero
    if ((t>0) && (j<=1) && (j>0) && (numeroEquipes>0)) {
        //Atribui os valores de custo e producao segundo os valores informados
        CP0 = 2500*numeroEquipes;
        VPI = 1000*numeroEquipes;
        CPI = 450*numeroEquipes;
        VPL = -CP0;
        
        //Calcula o VPL
        for (t=t; t>=1; t--) {
            VPL += (VPI-CPI)/powf((1+j), t);
        }
        
        //Apresenta a viabilidade do projeto caso o VPL seja positivo
        if (VPL>0) { printf("VPL igual a %0.2f: projeto viavel!\n", VPL); }
        else { printf("VPL igual a %0.2f: projeto inviavel!\n", VPL); }
        
    }
    else { printf("Entrada invalida!\n"); }
}
//----------OPCAO 3----------


//----------OPCAO 2----------
//Funcao que calcula o fatorial de um numero informado
double fatorial(int n)
{
    if (n==1) { return n; }
    else      { return n*fatorial(n-1); }
}

//Opcao 2 do menu inicial:
void Combinacao() //TO-DO: Verificar forma de apresentar o resultado em notacao cientifica
{
    int M, N;
    
    scanf("%d", &M);
    scanf("%d", &N);
    
    if ((N>0) && (N<=M)){
        if (M%N==0) {
            printf("O numero de equipes eh %d\n", M/N);
            double fM = fatorial(M);
            double fN = fatorial(N);
            double fMn = fatorial(M-N);
            double c = fM/(fN*fMn);
            printf("Pode-se combinar as equipes de %0.5e formas diferentes\n", c*c*c);
        }
        else printf("Divisao invalida!\n");
    }
    else printf("Entrada invalida!\n");
}
//----------OPCAO 2----------


//----------OPCAO 1----------
//Funcao recursiva que, dado um numero inicial, encontra o proximo numero primo
int proximoPrimo(int numeroAtual)
{   
    int ehPrimo = 1, i;
    numeroAtual++;
    
    //Verifica se o numero eh primo
    for (i = 2; i == numeroAtual/2; i++){
        if (numeroAtual%i == 0) ehPrimo = 0;}
    
    //Se o numero atual for primo retorna ele, senao chama a funcao novamente
    if (ehPrimo == 1) return numeroAtual;
    else return proximoPrimo(numeroAtual);
}

//Calcula a quantidade de times dado os numeros de funcionarios de cada setor (MDC dos 3 valores)
int verificaQuantidadeTimes(int funcionariosAdministracao, int funcionariosOperacional, int funcionariosVendas)
{
    int divisor = 2, MDC = 1;
    
    //Calcula o MDC dos 3 numeros
    do{        
        if ((funcionariosAdministracao % divisor == 0) && (funcionariosOperacional % divisor == 0) && (funcionariosVendas % divisor == 0)){
            funcionariosVendas = funcionariosVendas / divisor;
            funcionariosOperacional = funcionariosOperacional / divisor;
            funcionariosAdministracao = funcionariosAdministracao / divisor;
            MDC = MDC * divisor;}
        else divisor = proximoPrimo(divisor);
    } while (funcionariosAdministracao + funcionariosOperacional + funcionariosVendas > divisor+1);
    
    //Retorna o MDC calculado
    return MDC;
}

//Opcao 1 do menu inicial: Calcula a quantidade de times dos setores e apresenta a quantidade de membros por time em cada setor
void Times()
{
    int funcionariosAdministracao, funcionariosOperacional, funcionariosVendas, quantidadeTimes, valorValido = 1;
    
    //Le a quantidade de funcionarios de cada setor
    scanf("%d", &funcionariosAdministracao);
    if (((funcionariosAdministracao*10)%10 != 0) || (funcionariosAdministracao < 1)) valorValido = 0;
    scanf("%d", &funcionariosOperacional);
    if (((funcionariosOperacional*10)%10 != 0) || (funcionariosOperacional < 1)) valorValido = 0;
    scanf("%d", &funcionariosVendas);
    if (((funcionariosVendas*10)%10 != 0) || (funcionariosVendas < 1)) valorValido = 0;
    
    if (valorValido == 0) printf("Entrada invalida!\n");
    else{
        //Chama a funcao que verifica a quantide de times geral
        quantidadeTimes = verificaQuantidadeTimes(funcionariosAdministracao, funcionariosOperacional, funcionariosVendas);
        
        //Apresenta a quantide de membros por time de cada setor
        printf("Numero de times por setor eh %d\n", quantidadeTimes);
        printf("Administracao: %d membros por time\n", funcionariosAdministracao/quantidadeTimes);
        printf("Operacional: %d membros por time\n", funcionariosOperacional/quantidadeTimes);
        printf("Vendas: %d membros por time\n", funcionariosVendas/quantidadeTimes);}
}
//----------OPCAO 1----------

int main()
{
    int menu;
    
    //Apresenta o menu enquanto o usuario nao entrar com a opacao 4-Sair
    do{
        // Apresenta o menu inicial, le a opcao e chama a respectiva funcao
        // 4 fecha o programa e valores diferentes de 1 a 4 sao invalidos
        printf("1 - Times\n2 - Equipes\n3 - VPL\n4 - Sair\n");
        scanf("%d", &menu);
        if (menu == 1) Times();
        else if (menu == 2) Combinacao();
        else if (menu == 3) viabilidadeDoProjeto();
        else if (menu != 4) printf("Entrada invalida!\n");}
    while (menu != 4);
}
